package org.study.enums;

/**
 * 枚举类可以像普通类一样定义字段、方法和构造函数。这使得枚举常量不仅可以表示简单的值，还可以携带数据和行为。
 * 参考 https://blog.csdn.net/MeyrlNotFound/article/details/147870300
 * <p>
 * 在这个例子中：
 * 1、每个行星枚举常量都有质量(mass)和半径(radius)两个属性
 * 2、枚举类定义了构造函数来初始化这些属性
 * 3、枚举类还提供了计算表面重力和物体重量的方法
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2025年07月16日
 */
public class PlanetEnumTest {
    public static void main(String[] args) {
        // 地球上的重量(kg)
        double earthWeight = 70;
        double mass = earthWeight / Planet.EARTH.surfaceGravity();
        for (Planet p : Planet.values()) {
            System.out.printf("在%s上的重量是%f kg%n", p, p.surfaceWeight(mass));
        }
    }

    public enum Planet {
        MERCURY(3.303e+23, 2.4397e6),
        VENUS(4.869e+24, 6.0518e6),
        EARTH(5.976e+24, 6.37814e6),
        MARS(6.421e+23, 3.3972e6),
        JUPITER(1.9e+27, 7.1492e7),
        SATURN(5.688e+26, 6.0268e7),
        URANUS(8.686e+25, 2.5559e7),
        NEPTUNE(1.024e+26, 2.4746e7);

        // 质量(kg)
        private final double mass;
        // 半径(m)
        private final double radius;

        // 万有引力常数(m^3/kg s^2)
        private static final double G = 6.67300E-11;

        // 构造函数
        Planet(double mass, double radius) {
            this.mass = mass;
            this.radius = radius;
        }

        // 计算表面重力
        public double surfaceGravity() {
            return G * mass / (radius * radius);
        }

        // 计算物体在行星表面的重量
        public double surfaceWeight(double otherMass) {
            return otherMass * surfaceGravity();
        }
    }
}
